package data;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import util.UIDGenerator;
import domain.Actividad;
import domain.Quedada;
import domain.QuedadaActividad;

public class JDBCQuedadaDAO implements IQuedadaDAO{
	
	public List selectAllQuedadas (){
		
		Connection conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		ResultSet result = null;
		List listaQuedada = new LinkedList();
		String sql = "SELECT * FROM Quedada ";
		try {
			stmt = conn.prepareStatement(sql);
			result = stmt.executeQuery();
			while (result.next()) {
				Quedada quedada = rellenarQuedada(result);
				listaQuedada.add(quedada);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return listaQuedada;
	}

	public Quedada select(String nombre){
		Connection conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		ResultSet result = null;
		Quedada quedada=null;
		String sql = "SELECT * FROM Quedada WHERE (nombre = ?) ";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombre);
			result = stmt.executeQuery();
			while(result.next()){
				quedada = rellenarQuedada(result);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return quedada;
	}
	
	public void delete(Quedada quedada) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "DELETE FROM Quedada WHERE (OID = ?) ";
		try {	
			stmt = conn.prepareStatement(sql);
            stmt.setString(1, quedada.getQuedadaOID());
            stmt.executeUpdate();
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		
	}

	public void insert( String quedadaOID, Quedada quedada) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;

        List actividades = quedada.getActividades();
                
        insertQuedadaActividades(quedadaOID,actividades);

		String sql = "INSERT INTO Quedada (OID,NOMBRE,FECHAINICIO,LUGAR,DESCRIPCION,CUPOMAX) VALUES (?, ?, ?, ?, ?, ?) ";
		try {	
                    stmt = conn.prepareStatement(sql);
                    stmt.setString(1, quedadaOID);
                    stmt.setString(2, quedada.getNombre());
                    stmt.setDate(3, new java.sql.Date(quedada.getFechainicio().getTime()));
                    stmt.setString(4, quedada.getLugar());
                    stmt.setString(5, quedada.getDescripcion());
                    stmt.setInt(6, quedada.getCupomax());
                    stmt.executeUpdate();
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
	}
	
	private Quedada rellenarQuedada(ResultSet result) throws SQLException {
		Quedada quedada = new Quedada();
		quedada.setQuedadaOID(result.getString("OID"));
		quedada.setNombre(result.getString("NOMBRE"));
		quedada.setFechainicio(result.getDate("FECHAINICIO"));
		quedada.setLugar(result.getString("LUGAR"));
		quedada.setDescripcion(result.getString("DESCRIPCION"));
		quedada.setCupomax(result.getInt("CUPOMAX"));
		return quedada;
	}

        
        private void insertQuedadaActividades(String quedadaOID, List actividades) {
            Actividad a;
            QuedadaActividad qa;
            JDBCQuedadaActividadDAO qaDAO = new JDBCQuedadaActividadDAO();
            for(int i = 0; i < actividades.size(); i++){
                a = (Actividad) actividades.get(i);
                qa = new QuedadaActividad();
                String quedadaActividadOID = UIDGenerator.getInstance().getKey();
                qa.setOrdenActividad(i+1);
                qa.setQuedadaOID(quedadaOID);
                qa.setActividadOID(a.getActividadOID());
                qaDAO.insert(quedadaActividadOID, qa);
            }
        }

}



